package com.platform.common.config;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;

/**
 * 动态加载数据库中的配置 ClassName: DatabaseProperties
 * 
 * @Description: TODO
 *               然后根据数据库中的配置字段信息同步到上下文中让其它xml或者类引用，引用方式是xml通过${字段}，类引用的方式是@Value(
 *               "${字段}")
 */
@SuppressWarnings("rawtypes")
public class DatabaseProperties implements InitializingBean, FactoryBean {

	private static final Log log = LogFactory.getLog(DatabaseProperties.class);

	// 声明一个对象用于存储数据库中的配置字段信息
	private Properties props = new Properties();

	// 数据源
	private DataSource datasource;

	// 查询配置文件表的SQL语句
	private String query = "select ConfKey,ConfValue,Remark from isip_tb_propertiesconf where CurFlag > 0";

	public DatabaseProperties(DataSource datasource) {
		this.datasource = datasource;
	}

	@Override
	public void afterPropertiesSet() throws Exception {
		initProperties();
	}

	@Override
	public Object getObject() throws Exception {
		return props;
	}

	@Override
	public Class getObjectType() {
		return Properties.class;
	}

	@Override
	public boolean isSingleton() {
		return true;
	}

	/**
	 * 调用并初始化数据库中的配置字段到全局对象中
	 * 
	 * @Description: TODO
	 * @author cjy
	 * @date 2016-11-15
	 */
	private void initProperties() {
		// 定义连接数据库的变量对象
		Connection connection = null;
		try {
			// 获取数据库的连接
			connection = datasource.getConnection();
			// 执行数据查询
			PreparedStatement ps = connection.prepareStatement(query);
			// 获取查询的结果
			ResultSet rs = ps.executeQuery();
			// 遍历所有的数据，并把数据添加到全局上下文环境中
			while (rs.next()) {
				// 获取数据的key
				String key = rs.getString(1);
				// 获取key对应的值
				String value = rs.getString(2);
				// 判断key和value是否为空，当不为空时执行填充操作
				if (StringUtils.isNotEmpty(key) && StringUtils.isNotEmpty(value)) {
					log.debug("load property. Key=" + key + ",Value=" + value);
					// 添加到properties对象中
					props.setProperty(key, value);
				}
			}
			// 关闭ResultSet
			rs.close();
			ps.close();
		} catch (Exception e) {
			// 错误信息打印
			log.error(e);
		} finally {
			// 当连接对象不为空执行关闭
			if (connection != null) {
				try {
					connection.close();
				} catch (Exception e) {
					// 关闭异常时打印异常的原因
					log.error(e);
				}
			}
		}
	}
}